package date1208.aop;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * @author Yue
 * @date 2017年12月8日 上午10:05:43
 */
@Aspect
public class MultiAspect {
	// 定义 Before 增强处理执行
	@Before("execution(* date1208.aop.*.*(..))")
	public void authority(JoinPoint jp) {
		System.out.println("Before 增强：模拟执行权限检查");
		// 返回被织入增强处理的目标方法
		System.out.println("Before 增强：被织入增强处理的目标方法为：" + jp.getSignature().getName());
		// 访问执行目标方法的参数
		System.out.println("Before 增强：目标方法的参数为：" + Arrays.toString(jp.getArgs()));
		// 访问被增强处理的目标对象
		System.out.println("Before 增强：被织入增强处理的目标对象为：" + jp.getTarget());
	}

	// 定义 AfterReturning 增强处理执行
	@AfterReturning(pointcut = "execution(* date1208.aop.*.*(..))", returning = "rvt")
	public void log(JoinPoint jp, Object rvt) {
		System.out.println("AfterReturning 增强：获取目标方法返回值:" + rvt);
		System.out.println("AfterReturning 增强：模拟记录日志功能...");
		// 返回被织入增强处理的目标方法
		System.out.println("AfterReturning 增强：被织入增强处理的目标方法为：" + jp.getSignature().getName());
		// 访问执行目标方法的参数
		System.out.println("AfterReturning 增强：目标方法的参数为：" + Arrays.toString(jp.getArgs()));
		// 访问被增强处理的目标对象
		System.out.println("AfterReturning 增强：被织入增强处理的目标对象为：" + jp.getTarget());
	}

	// 定义 After 增强处理执行
	@After("execution(* date1208.aop.*.*(..))")
	public void release(JoinPoint jp) {
		System.out.println("After 增强：模拟方法结束后的释放资源...");
		// 返回被织入增强处理的目标方法
		System.out.println("After 增强：被织入增强处理的目标方法为：" + jp.getSignature().getName());
		// 访问执行目标方法的参数
		System.out.println("After 增强：目标方法的参数为：" + Arrays.toString(jp.getArgs()));
		// 访问被增强处理的目标对象
		System.out.println("After 增强：被织入增强处理的目标对象为：" + jp.getTarget());
	}
}
